<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<pre>
    暂不支持方法-日期拷贝

    let obj = {
        a:'a',
        arr:[1,2,3,4],
        date:new Date(),
        o:{
            o1:'o1'
        },
        fun(){
            console.log(this)
        }
    }
    let newObj = Object.assign({},obj)

    obj.arr[0] = 11
    console.log(obj.arr[0],newObj.arr[0],obj.arr === newObj.arr)//失败，全部修改

    obj.date.setTime(1624328000000)
    console.log(obj.date.getTime(),newObj.date.getTime(),obj.date===newObj.date)//失败，全部修改

    obj.o.o1 = '02'
    console.log(obj.o.o1,newObj.o.o1,obj.o===newObj.o)//失败，全部修改

    console.log(obj.fun()===newObj.fun())//失败，全部修改

    console.log('---------------------------------------')

    /**
     * JSON.parse(JSON.stringify())深拷贝
     * 缺陷：它会抛弃对象的constructor，深拷贝之后，不管这个对象原来的构造函数是什么，
     * 在深拷贝之后都会变成Object；这种方法能正确处理的对象只有 Number, String, Boolean, Array,扁平对象，
     * 也就是说，只有可以转成JSON格式的对象才可以这样用，像function没办法转成JSON；
     * @type {any}
     */
    let newObj2 = JSON.parse(JSON.stringify(obj))
    console.log(obj.arr === newObj2.arr)
    console.log(obj.o===newObj2.o)
    console.log(obj.date===newObj2.date)
    console.log(obj.fun===newObj2.fun)
    try {
        obj.fun()
        //方法没有拷贝过来
        newObj2.fun()
    }catch (e){
        console.warn('FX-TAG:',e)
    }

    console.log('---------------------------------------')

    //深拷贝---递归实现--不支持方法/日期   支持数组和对象
    function deepCopy(obj){
       let newArr = Array.isArray(obj) ? [] :{}
       for (let i in obj){
           if (obj.hasOwnProperty(i)){
               if (obj[i] != null && typeof obj[i] === 'object'){
                   newArr[i] = deepCopy(obj[i])
               }else {
                   newArr[i] = obj[i]
               }
           }
       }
       return newArr
    }


</pre>
<script>
    let obj = {
        a:'a',
        arr:[1,2,3,4],
        date:new Date(),
        o:{
            o1:'o1'
        },
        fun(){
            console.log(this)
        }
    }
    let newObj = Object.assign({},obj)

    obj.arr[0] = 11
    console.log(obj.arr[0],newObj.arr[0],obj.arr === newObj.arr)//失败，全部修改

    obj.date.setTime(1624328000000)
    console.log(obj.date.getTime(),newObj.date.getTime(),obj.date===newObj.date)//失败，全部修改

    obj.o.o1 = '02'
    console.log(obj.o.o1,newObj.o.o1,obj.o===newObj.o)//失败，全部修改

    console.log(obj.fun()===newObj.fun())//失败，全部修改

    console.log('---------------------------------------')

    /**
     * JSON.parse(JSON.stringify())深拷贝
     * 缺陷：它会抛弃对象的constructor，深拷贝之后，不管这个对象原来的构造函数是什么，
     * 在深拷贝之后都会变成Object；这种方法能正确处理的对象只有 Number, String, Boolean, Array,扁平对象，
     * 也就是说，只有可以转成JSON格式的对象才可以这样用，像function没办法转成JSON；
     * @type {any}
     */
    let newObj2 = JSON.parse(JSON.stringify(obj))
    console.log(obj.arr === newObj2.arr)
    console.log(obj.o===newObj2.o)
    console.log(obj.date===newObj2.date)
    console.log(obj.fun===newObj2.fun)
    try {
        obj.fun()
        //方法没有拷贝过来
        newObj2.fun()
    }catch (e){
        console.warn('FX-TAG:',e)
    }

    console.log('---------------------------------------')

    //深拷贝---递归实现--不支持方法/日期   支持数组和对象
    function deepCopy(obj){
       let newArr = Array.isArray(obj) ? [] :{}
       for (let i in obj){
           if (obj.hasOwnProperty(i)){
               if (obj[i] != null && typeof obj[i] === 'object'){
                   newArr[i] = deepCopy(obj[i])
               }else {
                   newArr[i] = obj[i]
               }
           }
       }
       return newArr
    }


</script>
</body>
</html>